package javaapplication2;

// Interface:
// DGBI (constructor)  O(n)
// cantidadCruces() O(1) si no se tocó el dibujo, si se tocó tenemos #V1*#V1*(#V1*#V2)=(#V1)^3*#V2
//  SI #V1+#V2= N
// ENTONCES #V1=N-#V2
// (N-#V2)^3*#V2  EL PEOR CASO ES CUANDO #V2=1, ENTONCES TENEMOS UNA COMPLEJIDAD DE O(N^3) PARA BUSCAR TODOS LOS 
// CRUCES LA PRIMERA VEZ.

public class DGBI {
    // Miembros
    private grafo g;
    private Integer[] V1;
    private Integer[] V2;
    private int cruces;
    private boolean actualizado;
    // Métodos
    // Constructor
    DGBI(Integer[] v1, Integer[] v2, Eje[] ejes)
    {
        int l1=v1.length;
        int l2= v2.length;
        g = new grafo(l2+l1, false);
        V1=v1;
        V2=v2;
        int e=0;
        while (e<ejes.length)
        {
            g.insert(ejes[e]);
            e++;
        }
        cruces=cantidadCruces();
        actualizado=true;
    }
    public int cantidadCruces()
    {
        if (!actualizado)
        {
            cruces=0; // Me preparo para contar..
            // Recorro todos los vértices y analizo cuales vertices de la otra particion tienen ejes que se cruzan
            int v=0;
            while (v<V1.length)
            {
                Integer[] adytsv1 = g.adyacentes(V1[v]); //Obtengo los ejes adyacentes al vertice
                int nroEje=0;  // Contador para ir analizando los ejes.
                while (nroEje<adytsv1.length)
                {
                    // Recorro los ejes de todos los vertices siguientes al elegido
                    int vertice2=v+1;
                    while (vertice2<V1.length)
                    {
                        Integer[] adytsv2 = g.adyacentes(V1[vertice2]);
                        int looper=0;
                        int verticeAux;
                        while (looper<adytsv2.length)
                        {
                            verticeAux=adytsv2[looper];
                            if (verticeAux<adytsv1[nroEje])
                            {
                                cruces++;
                            }
                        }
                        vertice2++;
                    }
                    nroEje++;
                }
                v++;
            }
        }
        actualizado=true;
        return cruces;
    }
}
